﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using SIGERP_Negocio;
using SIGERP_Entidades;
using System.Text.RegularExpressions;

namespace SIGERP_Presentacion
{
    public partial class frmUsuarioActualizar : Form
    {
        List<Departamento> departamentos=new List<Departamento>();
        DataTable dt;
        Usuario u;
        List<Area> areasHabilitadas;
        private ErrorProvider ep = new ErrorProvider();
        

        public frmUsuarioActualizar(Usuario usuario)
        {
            u=usuario;
            departamentos = u.departamentos;
            InitializeComponent();
            llenarCmbTipo();
            llenarCmbArea();
            llenarCampos();
            
        }

        private void llenarCampos()
        {
            txtUsuario.Text = u.descripcion;
            txtApellido.Text = u.apellido;
            txtNombre.Text = u.nombre;
            txtEmail.Text = u.email;
            if (u.habilitado)
            {
                cmbHabilitado.SelectedItem = "HABILITADO";
            }
            else {
                cmbHabilitado.SelectedItem = "INHABILITADO";
            }
            
            foreach(TipoUsuario tu in cmbTipoUsuario.Items){
                if (tu.id == u.tipo.id) cmbTipoUsuario.SelectedItem=tu;
            }
        }

        private void llenarCmbArea()
        {
            areasHabilitadas = Areas.buscarAreasHabilitadas();
            Area todas = new Area();
            todas.id = 0;
            todas.descripcion = "TODAS";
            cmbArea.Items.Add(todas);
            foreach (Area a in areasHabilitadas){
                cmbArea.Items.Add(a);
            }  
            if(cmbArea.Items.Count>0)
                cmbArea.SelectedIndex=0;
        }

        private void llenarCmbTipo()
        {
            List<TipoUsuario> tipos = Usuarios.buscarTiposUsuario();
            foreach (TipoUsuario t in tipos)
            {
                cmbTipoUsuario.Items.Add(t);
            }
            if (cmbTipoUsuario.Items.Count > 0)
                cmbTipoUsuario.SelectedIndex = 0;
        }

        private void llenarCmbDepto()
        {
            List<Departamento> departamentos = Departamentos.buscarDepartamentosArea((Area)cmbArea.SelectedItem);
            cmbDepartamento.Items.Clear();
            if (((Area)cmbArea.SelectedItem).id != 0)
            {
                Departamento todos = new Departamento();
                todos.id = 0;
                todos.descripcion = "TODOS";
                cmbDepartamento.Items.Add(todos);

                foreach (Departamento d in departamentos)
                {
                    cmbDepartamento.Items.Add(d);
                }
                if (cmbDepartamento.Items.Count > 0)
                    cmbDepartamento.SelectedIndex = 0;
            }
        }

        private void frmPaisAgregar_Load(object sender, EventArgs e)
        {

            dt = new DataTable();
            dt.Columns.Add("Id", typeof(int));
            dt.Columns.Add("Departamento", typeof(string));
            dt.Columns.Add("Área", typeof(string));
            cargarGrilla();
            grilla.DataSource = dt;
            DataGridViewButtonColumn btn = new DataGridViewButtonColumn();
            grilla.Columns.Add(btn);
            btn.HeaderText = "";
            btn.Text = "Quitar";
            btn.Name = "btn";
            btn.UseColumnTextForButtonValue = true;
            grilla.Columns[0].Visible = false;
        }

        private void cargarGrilla()
        {
            dt.Clear();
 	        foreach(Departamento d in departamentos){
                dt.Rows.Add(d.id,d,d.area);
            }
        }

        private void btnCancelar_Click(object sender, EventArgs e)
        {
            Close();
        }

        private void cmbArea_SelectedIndexChanged(object sender, EventArgs e)
        {
            llenarCmbDepto();
        }

        private void btnGuardar_Click(object sender, EventArgs e)
        {
            ep.Clear();

            if (txtApellido.Text.Equals(""))
            {
                ep.SetError(txtApellido, "Este campo es obligatorio");
                txtApellido.Focus();
                return;
            }

            if (txtNombre.Text.Equals(""))
            {
                ep.SetError(txtNombre, "Este campo es obligatorio");
                txtNombre.Focus();
                return;
            }

            if (txtEmail.Text.Equals(""))
            {
                ep.SetError(txtEmail, "Este campo es obligatorio");
                txtEmail.Focus();
                return;
            }

            if (!Usuario.validarEmail(txtEmail.Text))
            {
                ep.SetError(txtEmail, "El correo electrónico no tiene un formato válido");
                txtEmail.Focus();
                return;
            }

            if (departamentos.Count == 0)
            {
                if (MessageBox.Show("El usuario no tendrá acceso a ningún departamento ¿Desea continuar?", Text, MessageBoxButtons.YesNo, MessageBoxIcon.Warning, MessageBoxDefaultButton.Button2) != DialogResult.Yes)
                {
                    return;
                }
            }
                actualizarUsuario();

        }

        private void actualizarUsuario()
        {
            u.nombre = txtNombre.Text;
            u.apellido = txtApellido.Text;
            u.email = txtEmail.Text;
            u.tipo = (TipoUsuario)cmbTipoUsuario.SelectedItem;
            u.descripcion = txtUsuario.Text;
            u.departamentos = departamentos;
            if (cmbHabilitado.SelectedItem.Equals("HABILITADO"))
                u.habilitado = true;
            else
                u.habilitado = false;
            Usuarios.actualizar(u);
            Dispose();
        }

        private void btnAgregar_Click(object sender, EventArgs e)
        {
            if (((Area)cmbArea.SelectedItem).id == 0)
            {

                foreach (Area a in areasHabilitadas)
                {
                    foreach (Departamento d in Departamentos.buscarDepartamentosArea(a))
                    {
                        agregarDepartamento(d);
                    }
                }
            }
            else if (((Departamento)cmbDepartamento.SelectedItem).id == 0)
            {

                foreach (Departamento d in Departamentos.buscarDepartamentosArea((Area)cmbArea.SelectedItem))
                {
                    agregarDepartamento(d);
                }

            }
            else
            {

                if (cmbDepartamento.SelectedItem != null)
                {
                    Departamento d = (Departamento)cmbDepartamento.SelectedItem;
                    agregarDepartamento(d);
                }
            }
        }

        private void agregarDepartamento(Departamento d)
        {
            if (!existeEnArreglo(d))
            {
                departamentos.Add(d);
                cargarGrilla();
            }
        }

        private bool existeEnArreglo(Departamento d)
        {
            bool existe = false;
            foreach (Departamento dep in departamentos) {
                if (dep.id == d.id) {
                    existe = true;
                }
            }
            return existe;
        }

        private void quitar()
        {
            if (grilla.SelectedRows.Count>0)
            {
                int id = Convert.ToInt32(grilla.SelectedRows[0].Cells["Id"].Value);
                if(departamentos.Count>0){
                    Departamento deptoAEliminar = null;
                    foreach (Departamento dep in departamentos)
                    {
                        if (dep.id == id)
                        {
                            deptoAEliminar=dep;
                        }
                    }
                    departamentos.Remove(deptoAEliminar);
                    cargarGrilla();
                }
            }
        }

        private void grilla_CellClick(object sender, DataGridViewCellEventArgs e)
        {
            if (e.ColumnIndex == 3)
            {
                quitar();
            }
        }
    }
}
